/******************************************************************************
 * \brief	私有通信协议传输层数据段的相关操作
 * \note	File format: UTF-8，中文编码：UTF-8
 * \author	将狼才鲸
 * \date	2023-03-25
 ******************************************************************************/

/*********************************** 头文件 ***********************************/
#include "scp_protocol.h"

/********************************** 接口函数 **********************************/
/**
 * \brief	从通信片段segment_t中获取名为private_data的成员
 */
uint8_t *scpseg_pri(segment_t *seg)
{
	uint8_t *su = (uint8_t *)seg;
	size_t sz = offsetof(segment_t, private_data);

	sz = ALIGN_TO(sz, 16L);
	return (uint8_t *)(su + sz);
}

/**
 * \brief	从通信片段segment_t的private_data成员中获取seg_pkt_head_t实际包数据
 */
uint8_t *scpseg_data(segment_t *seg)
{
	uint8_t *su = (uint8_t *)scpseg_pri(seg);	/* segment unit */

	return (uint8_t *)(su + SEGMENT_USER_SIZE);
}

/**
 * \brief	申请数据段句柄空间
 */
segment_t *scpseg_new(scp_dev_t *pdev)
{
	segment_t *seg;
	qbuf_t *qbuf;

	qbuf = qbuf_alloc(QBUF_GROUP_MSGBUF);
	if (qbuf == NULL)
		return NULL;

	seg = (segment_t *)(qbuf->addr);
	memset(seg, 0, sizeof(segment_t) + sizeof(seg_pkt_head_t) * 2);

	init_list_head(&seg->node);

	seg->qbuf = qbuf;	/* segment_t自己所在的缓存 */
	seg->pdev = pdev;

	return seg;
}

/**
 * \brief	要发送的通信包是否存在
 */
bool scpseg_valid(segment_t *seg)
{
	if (!seg || !QBUF_ISVALID(seg->qbuf))
		return false;

	return true;
}

/**
 * \brief	删除一个通信包
 */
bool scpseg_free(segment_t *seg)
{
	irq_flag lock;

	if (!scpseg_valid(seg))	/* 通信包存在 */
		return false;

	irq_disable(lock);
	if (!list_empty(&seg->node)) {	/* 消息中携带的链表非空 */
		list_del_init(&seg->node);	/* 将链表初始化 */
	}
	irq_enable(lock);

	if (seg->req_qbuf) {	/* 如果请求缓存存在则删除 */
		qbuf_free(seg->req_qbuf);
		seg->req_qbuf = NULL;
	}
	if (seg->rsp_qbuf) {	/* 如果响应缓存存在则删除 */
		qbuf_free(seg->rsp_qbuf);
		seg->rsp_qbuf = NULL;
	}

	if (seg->qbuf) {		/* 如果消息缓存存在则删除 */
		qbuf_free(seg->qbuf);
		seg->qbuf = NULL;
	}

	return true;
}

/*********************************** 文件尾 ***********************************/
